package labox.innovation.gameserver.templates.item;

import java.util.HashMap;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Node;


import javolution.util.FastList;

import labox.innovation.config.Config;
import labox.innovation.gameserver.model.L2ItemInstance.ItemGradeType;
import labox.innovation.gameserver.templates.StatsSet;
import labox.innovation.util.Rnd;

/**
 *  ������� ��Ʒ����Ʒ�� �������
 *  
 * @author zjj
 *
 */
public final class MobItemCreateConfig extends ParseItemConfig {
	
	static Logger _log = LoggerFactory.getLogger(MobItemCreateConfig.class.getName());
	
	private static final int MAX_RAND_NUM = 10000;


	// TODO : ����Ҫ�� ��ɾ��
//	//���ﾫӢ�ȼ�
//	public enum MobGradeType{
//		NORMAL,                  //��ͨ
//		STRENGTHEN,              //ǿ��
//		ELITE,                   //��Ӣ
//		CHIEF,                   //����
//		LEGEND                   //��˵
//	}
	
	private HashMap<Integer, List<MobItemChance> > _allMobItemChance = new HashMap<Integer, List<MobItemChance>>();
	
	public static final MobItemCreateConfig getInstance() {
		return SingletonHolder._instance;
	}
	
	
    /**
     * ��� ���� ��Ʒ��Ʒ��
     * mobGrade : ���� ��Ӣ�ȼ�
     * moblvl   : ����ȼ�
     * @return -1 ��ʾ����  or �������ƷƷ������
     */
    public int getMobItemGrade( int mobGrade, int moblvl )
    {
    	List<MobItemChance> temp = getMobItemChance( mobGrade );
    	
    	if( temp == null )
    	{
//    		System.out.println("����ľ�Ӣ�ȼ�������");
    		_log.warn("����ľ�Ӣ�ȼ�������," +  mobGrade +  moblvl , Config.SERVER_ID);
    		return -1;
    	}
    	
    	for(MobItemChance mic : temp )
    	{
    		if( mic.isThis( moblvl ) )
    		{
    			return mic.getMobItemGrade();
    		}
    	}
    	
//    	System.out.println("�����Ʒ�ʼ��ʲ�ȫ");
    	temp = null;
    	return -1;
    	
    }// end getMobItemGrade
	
	
//	public void loadConfig()
//	{
//		File _file = new File(Config.DATAPACK_ROOT, filename );
//		Document doc;
//		try
//        {
//            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//            factory.setValidating(false);
//            factory.setIgnoringComments(true);
//            doc = factory.newDocumentBuilder().parse(_file);
//            
//            Node n = doc.getFirstChild();
//            
//            if( "list".equalsIgnoreCase( n.getNodeName() ) )
//            {
//            	NodeList chanceList = doc.getElementsByTagName("chance");
//            	for( int i =0; i < chanceList.getLength(); i++ )
//            	{
//            		Node node = chanceList.item(i);
//            		NamedNodeMap attrs = node.getAttributes();
//            		int iMobGrade = Integer.parseInt( attrs.getNamedItem("mobGrade").getNodeValue() );
//            		
//            		NodeList mobLvlList = ( (Element)node ).getElementsByTagName("mobLvl");
//            		for( int j=0; j < mobLvlList.getLength(); j++ )
//            		{
//            			Node lvlnode = mobLvlList.item(j);
//            			NamedNodeMap lvlattrs = lvlnode.getAttributes();
//            			StatsSet set = new StatsSet();
//            			String lvlrange = lvlattrs.getNamedItem("lvlRange").getNodeValue();
//            			set.set("lvlRange", lvlrange);
//            			
//            			NodeList setList = ( (Element)lvlnode ).getElementsByTagName("set");
//            			
//            			for( int k=0; k<setList.getLength(); k++)
//            			{
//            				parseBeanSet( setList.item( k ), set );
//            			}
//            			
//            			addMobItemChance(iMobGrade, set);
//            			
//            		}// end for( int j=0; j < mobLvlList.getLength(); j++ )
//            		
//            	}// end for( int i =0; i < chanceList.getLength(); i++ )
//            	
//            }// end  if( "list".equalsIgnoreCase( n.getNodeName() ) )
//            
//        }
//        catch (Exception e)
//        {
//            _log.log(Level.SEVERE, "Error loading file " + _file, e);
//            return ;
//        }
//        
//	}// end 
	
	
    /**
     * ���� node �����ԣ� ���������ֶμ��뵽 set��ȥ
     * @param node
     * @param set
     */
    protected void parseBeanSet( Node node , StatsSet set )
    {
    	if( node == null )
    	{
    		return;
    	}
        String name = node.getAttributes().getNamedItem("name").getNodeValue().trim();
        String value = node.getAttributes().getNamedItem("val").getNodeValue().trim();
        
        set.set(name, value);
    }
    
	
	/**
	 *  ��� ָ�� �������͵� ��ƷƷ�ʼ������
	 * @param iType
	 * @param set
	 */
	protected void addMobItemChance( int iType, final StatsSet set )
	{
		List<MobItemChance> temp = getMobItemChance( iType );
		if( temp == null )
		{
			temp = new FastList<MobItemChance>();
		}
		
		temp.add( new MobItemChance(set) );
		_allMobItemChance.put( iType , temp );
		
	}
	
	/**
	 *  ����������
	 */
	protected void addItemConfig( final String iType, final StatsSet set )
	{
		addMobItemChance( Integer.parseInt( iType ), set );
	}
	
	
	// ��� ָ���������͵� ��ƷƷ�ʼ���
	// ��Ϊ���� ���ж༶�� ���Ի��ж��
	protected List<MobItemChance> getMobItemChance( int iType )
	{
		return _allMobItemChance.get( iType );
	}
	
	/**
	 *  ���� �����Ʒ Ʒ�� ���ʵ��������
	 *  ���ﲻͬ�ȼ� ��Ӧ��Ʒ�ʸ��� ȫ���������������
	 * @author zjj
	 *
	 */
 	protected class MobItemChance{
		
		private int _talismanChance;   //������������
		private int _baodeviceChance;  //������������
		private int _lingdeviceChance; //������������
		private int _treasureChance;   //������������
		private int _horlChance;       //������������
		
		protected int _lvlMin;         //�ȼ�����
		protected int _lvlMax;         //�ȼ�����
		
		public MobItemChance(StatsSet set)
		{
			_talismanChance = set.getInteger("talismanChance", 0);
			_baodeviceChance = _talismanChance + set.getInteger("baodeviceChance", 0);
			_lingdeviceChance = _baodeviceChance + set.getInteger("lingdeviceChance", 0);
			_treasureChance = _lingdeviceChance + set.getInteger("treasureChance", 0);
			_horlChance = _treasureChance + set.getInteger("horlChance", 0);
			
			String str = set.getString("lvlRange");
			
			String str_int[] = str.split("-");
			
			_lvlMin = Integer.parseInt( str_int[0] );
			_lvlMax = Integer.parseInt( str_int[1] );
		}
		
		//�Ƿ�������ȼ���Χ֮��
		public Boolean isThis( int ilvl )
		{
			return ilvl >=_lvlMin && ilvl <= _lvlMax;
		}
		
		/**
		 * ��� ������ɵ���Ʒ Ʒ��
		 * @return int -1:��ʾ ����
		 */
		public int getMobItemGrade()
		{
			int iChance = Rnd.get( MAX_RAND_NUM + 1);
			
			if( isTalisman( iChance ) )
			{
				return ItemGradeType.TALISMAN.ordinal();
			}
			
			if( isBaoDevice( iChance ) )
			{
				return ItemGradeType.BAODEVICE.ordinal();
			}
			
			if( isLingDevice( iChance ) )
			{
				return ItemGradeType.LINGDEVICE.ordinal();
			}
			
			if( isTreasure( iChance ) )
			{
				return ItemGradeType.TREASURE.ordinal();
			}
			
			if( isHorl( iChance ) )
			{
				return ItemGradeType.HORL.ordinal();
			}
			
			return -1;
		}
		
		
		
		/**
		 * �Ƿ��� ����
		 * @return
		 */
		private Boolean isTalisman( int iChance )
		{
			return iChance>=0 && iChance <= _talismanChance;
		}
		
		/**
		 * �Ƿ���
		 * @param iChance
		 * @return
		 */
		private Boolean isBaoDevice( int iChance )
		{
			return iChance>=_talismanChance && iChance <= _baodeviceChance;
		}
		
		private Boolean isLingDevice( int iChance )
		{
			return iChance>=_baodeviceChance && iChance <= _lingdeviceChance;
		}
		
		private Boolean isTreasure( int iChance )
		{
			return iChance>=_lingdeviceChance && iChance <= _treasureChance;
		}
		
		private Boolean isHorl( int iChance )
		{
			return iChance>=_treasureChance && iChance <= _horlChance;
		}
		
	}// end MobItemChance
	
	
	@SuppressWarnings("synthetic-access")
	private static class SingletonHolder {
		protected static final MobItemCreateConfig _instance = new MobItemCreateConfig();
	}
	
	private MobItemCreateConfig()
	{
		_filename = "data/Stats/Config/MobItemCreateConfig.xml";
		_topTag = "chance";
		_topAttri = "mobGrade";
		
		_secondTag = "mobLvl";
		_secondAttri = "lvlRange";
	}
}
